version 05/01/2021
rev ..........
Test Interrupt On Change avec PIC
18F27K42
* Test sur RA5 IOC avec
MikroC 7.60 (OK)
* avec Mplabx XC8 .. à
suivre
*NECTO
STUDIO MikroC AI I2C
Hardware .. à suivre
Interrupt
On Change sur pin RA5 18F27K42 (MikroC)
Hardware :
Base 18F27K42
HARDWARE
Alimentation VCC= 3.6V
Carte BASE 18F27K42
Entree testée =RA5 input !
Led sur RA4 pour signaler l'IT IOC
UART1 TX sur RC6
Utilisation de mon generateur BF , avec mode Coup par coup via un
Bouton Poussoir
pour éviter tout rebonds sur le signal d'entree RA5.
Contrairement aux Anciens PIC (qui ne geraient que le PORTB) ,
avec celui ci on peut genérer une interruption via N'IMPORTE
QUELLE pin du MCU
Extrait datasheet :
18.0 INTERRUPT-ON-CHANGE
Interruption sur changement d'etat sur n'importe quelle broche (Pin)
d'un PORT.
18.1 Enabling the Module
Validation du registre PIEx pour permettre la generation d'une
interruption sur une broche d'un PORT
le bit IOCIE correspondant du registre PIEx doit etre armé pour
generer l'interruption.
Ceci n'empeche pas la detection de se faire ..
18.2 Individual Pin Configuration
Pour chaque pin de PORT, un detecteur de front Montant ou
Descendant est présent
Pour valider une detection de front Montant sur une Pin , le bit
associé du registre IOCxP (P comme Positif!) est mis à 1 .
Pour valider une detection de front Descendant sur une Pin , le
bit associé du registre IOCxN (N comme Negatif!)est mis à 1 .
Une pin (broche) peut etre configuée en detection Front Montant
ET Decendant , en armant (Mise à 1 ) le bit des 2 registres
correspondant IOCxP ET IOCxN
18.3 Interrupt Flags
les bits IOCAFx, IOCBFx, IOCCFx et IOCEF3 sont situés dans les
registres respectifs IOCAF, IOCBF, IOCCF and IOCEF
leurs etats 0 ou 1 , reflete l'etat Interrupt On Change du PORT
concerné.
Si un changement de front attendu est detecté sur la broche (Pin)
validée en detection , le bit IOCIE est armé (mis à 1)
=> interruption autorisée
le bit IOCIF est aussi armé, il reflete l'etat de toutes le spin
concernée sur les PORTS IOCAFx, IOCBFx,IOCCFx,IOCEF3_bit
18.4 Clearing Interrupt Flags RAZ des drapeaux
L'eat individuel des drapeaux representant les entrees du PORT (IOCAFx,
IOCBFx, IOCCFx et IOCEF3 bits),
peut etre respectivement remis à zero .
Si une autre detection de front est detectée pendant la remise
à zero,
le flag associé est à nouveau remis à un.
Pour s'assurer qu'aucun Front ne soit perdu , pendant la remise
à zero du Flag ( en cours de traitement)
Seule une operation utilisant un MASQUE permettant d'isoler le(s)
bit(s) connu comme ayant changé
doit etre réalisée.
exemple de sequence :
MOVLW 0xff
XORWF IOCAF, W
ANDWF IOCAF, F
le test ci-dessu n'est pas
convainquant ..pour ma part .
L'UART1 est utilisé pour suivre le deroulement du programme ( as
usual).
La partie Initialisation pour gerer l'Interruption sur Front
Montant arrivant sur la pin RA5
LATA4_bit = 0;
CountRA5=0;
INLVLA.B5=1; //1 = ST input used for port reads and interrupt-on-change
IOCAF=0;
IOCAP5_bit = 1; // Interrupt ON rising edge RA5
IOCAN5_bit = 0; // no interrupt on Falling edge on RA5
IOCIF_bit = 0; // drapeau general interrupt
IOCIE_bit = 1; //IOCIE: Interrupt-on-Change Enable bit
GIE_bit = 1;
j=0;
-------- le corps du programme -----
WordToStr(CountRA5,CRam1);
CPrint(" Rising Edge count on RA5= ");
Print(CRam1);
do
{
// show the status of RA5 input
CPrint(" RA5= ");
UART1_Write(PORTA.B5+48);
UART1_Write(TAB);
if ((j%8==0) &&( j>0))
{
CRLF1(); // new empty line every 8 values
}
if (PORTA.B4==1) // interrupt armed this bit !
{
CPrint(" Rising Edge occured on RA5 count= ");
WordToStr(CountRA5,CRam1);
Print(CRam1);
CRLF1();
LATA4_bit = 0;
IOCIE_bit=1; // re-arme interrupt for next test
// so we have enough time to see what is happenning
}
CRLF1();
Delay_1sec();
j++;
}
while(1);
La gestion de l'interruption : ( integrée aux
autres interrupts UART1,Timer0,Timer1)
void Interrupts() iv 0x0008 ics ICS_AUTO
{
if ( (IOCAF.B5==1) && (IOCIE_bit==1))
{
IOCAF.B5=0; // Raz du flag IOC sur RA5
LATA4_bit = 1;// led sur RA4 ON
/* le code , ci-dessous n'est pas efficace
_asm{
MOVLW 0xFF
XORWF IOCAF, W
ANDWF IOCAF, F
}
*/
CountRA5++; // incremente le compteur d' IOC RA5
IOCIE_bit=0; // pour ne capter qu'un seul Front ( si usage d'un
BP avec rebonds !)
// n'est pas utile avec le montage hardware Anti-bounces
!
}
}
Execution du programme ( via terminal)
ON voit bien que le front Descendant ne genere pas d'interrupt,
et
QUE SEUL LE FRONT MONTANT est bien VU.
Programme:
last update : 05/01/2021
projet MikroC 7.60 ....OK !
Projet : 18F27K42_Test_Interrupt_on_change_RA5_MC.zip
main : PIC18F27K42_UART1_test_interrupt_On_Change_RA5_MC_2021_0105.c
Chargeur : Test_Interrupt_On_Change_18F27K42_MC_2021.hex